IAM ユーザーが所属している IAM グループとアタッチされている IAM ポリシーの一覧を AWS CLI で取得する
IAM ユーザーの現状を棚卸ししたい
コンバンハ、千葉(幸)です。
IAM ユーザーはきちんと管理されていますか?最近 100名近く IAM ユーザーが存在する環境をご支援する機会がありました。ユーザーがどんなグループに所属していてそれぞれどんな権限を有しているか、きっちりした設計書が無く。まずはそれを棚卸ししてからあるべき構成を考えていきましょう、というアプローチを取りました。
単に IAM ユーザーの一覧を取得するだけであれば以下のエントリにある内容を踏襲すればいいのですが、今回はそれより詳細な情報が必要です。
ということで、AWS CLI で一覧を取得してみました。(その後にスプレッドシートで頑張りました。)
IAM ユーザーに割り当てられるポリシーについておさらい
IAM ユーザー、グループ、ポリシーについておさらいしておきましょう。
- IAM ユーザー、IAM グループそれぞれに IAM ポリシーをアタッチできる
- IAM ユーザーは自身が所属する IAM グループにアタッチされた IAM ポリシーを継承する
- IAM ポリシーには管理ポリシーとインラインポリシーがある *1 *2
つまり、IAM ユーザーに割り当てられた IAM ポリシーを一覧で確認しようとすると以下の情報を取得する必要があります。
- IAM ユーザーが所属する IAM グループの一覧
- IAM グループにアタッチされた管理ポリシーの一覧
- IAM グループにアタッチされたインラインポリシーの一覧
- IAM ユーザーに直接アタッチされた管理ポリシーの一覧
- IAM ユーザーに直接アタッチされたインラインポリシーの一覧
全部の情報を統合していい感じに出力できればいいのですが、実現しようとするとかなり複雑になりそうなので、今回はそれぞれ独立した情報で取得します。今回のエントリで行うのはそこまでです。
それらを必要に応じてスプレッドシートで加工・統合して情報を整理してもらえればと思います。
実行環境
今回使用した AWS CLI のバージョンは以下です。特に目新しいコマンドは使わないので、ある程度古いバージョンでも問題なく動作するかと思います。
% aws --version aws-cli/2.8.8 Python/3.9.11 Darwin/22.1.0 exe/x86_64 prompt/off
また、わたしは主に Mac 端末で実行しましたが、AWS CloudShell でも問題なく動作しました。
IAM ユーザーが所属する IAM グループ一覧の取得
まずは IAM ユーザーごとに、所属する IAM グループの一覧を取得します。これはサーバーワークスさんの以下のエントリを参考にさせていただきました。
コマンドの内容は以下です。
echo "UserName Groups" > /tmp/awscli.tmp aws iam list-users --query "Users[].[UserName]" --output text | sort | while read line;\ do echo ${line} > /tmp/awscli-group.tmp;\ aws iam list-groups-for-user --user-name ${line} --query "Groups[].[GroupName]" --output text >> /tmp/awscli-group.tmp;\ cat /tmp/awscli-group.tmp | tr "\n" " " | sed 's/$/\n/g' >> /tmp/awscli.tmp;\ done column -t /tmp/awscli.tmp;\ rm /tmp/awscli.tmp /tmp/awscli-group.tmp
これの実行結果のイメージはこんな感じ。
UserName Groups Chiba GroupB Saitama Kanagawa GroupA GroupB GroupC test-user-tokyo
出力結果をスプレッドシートに貼り付けて列分割をすればいい感じになります。
コマンドの内訳を見てみる
上記のコマンドの内訳を簡単に確認しておきます。
/tmp/awscli.tmp
にヘッダーを出力- IAM ユーザーの一覧を取得し、ユーザーごとに以下をループ
/tmp/awscli-group.tmp
にユーザー名を出力(上書き)- ユーザーが所属している IAM グループの一覧を
/tmp/awscli-group.tmp
に出力 /tmp/awscli-group.tmp
の内容を「改行を除外」&「末尾に改行を付与」し/tmp/awscli.tmp
に出力(追記)
/tmp/awscli.tmp
の内容を表形式に整形する/tmp/awscli.tmp
と/tmp/awscli-group.tmp
を削除
/tmp/awscli-group.tmp
がループ処理の中で都度上書きされ、そこでの内容が/tmp/awscli.tmp
に追記されて最終出力のベースになる、ということですね。
2.2. の段階における/tmp/awscli-group.tmp
の中身はこんな感じ。
Kanagawa GroupA GroupB GroupC
これを 2.3. で以下のような形にして/tmp/awscli.tmp
に追記していく、という形です。
Kanagawa GroupA GroupB GroupC
使用されている AWS CLI コマンドは以下の通り。
以降のコマンドも、使用する AWS CLI コマンドが異なるだけで基本的な構文は同様です。
IAM グループにアタッチされた管理ポリシー一覧の取得
echo "GroupName Policies" > /tmp/awscli.tmp aws iam list-groups --query "Groups[].[GroupName]" --output text | sort | while read line;\ do echo ${line} > /tmp/awscli-policy.tmp;\ aws iam list-attached-group-policies --group-name ${line} --query "AttachedPolicies[].[PolicyName]" --output text >> /tmp/awscli-policy.tmp;\ cat /tmp/awscli-policy.tmp | tr "\n" " " | sed 's/$/\n/g' >> /tmp/awscli.tmp;\ done column -t /tmp/awscli.tmp;\ rm /tmp/awscli.tmp /tmp/awscli-policy.tmp
- list-groups — AWS CLI 2.9.0 Command Reference
- list-attached-group-policies — AWS CLI 2.9.0 Command Reference
IAM グループにアタッチされたインラインポリシー一覧の取得
echo "GroupName InlinePolicies" > /tmp/awscli.tmp aws iam list-groups --query "Groups[].[GroupName]" --output text | sort | while read line;\ do echo ${line} > /tmp/awscli-policy.tmp;\ aws iam list-group-policies --group-name ${line} --query "PolicyNames[]" --output text >> /tmp/awscli-policy.tmp;\ cat /tmp/awscli-policy.tmp | tr "\n" " " | sed 's/$/\n/g' >> /tmp/awscli.tmp;\ done column -t /tmp/awscli.tmp;\ rm /tmp/awscli.tmp /tmp/awscli-policy.tmp
IAM ユーザーにアタッチされた管理ポリシー一覧の取得
echo "UserName Policies" > /tmp/awscli.tmp aws iam list-users --query "Users[].[UserName]" --output text | sort | while read line;\ do echo ${line} > /tmp/awscli-policy.tmp;\ aws iam list-attached-user-policies --user-name ${line} --query "AttachedPolicies[].[PolicyName]" --output text >> /tmp/awscli-policy.tmp;\ cat /tmp/awscli-policy.tmp | tr "\n" " " | sed 's/$/\n/g' >> /tmp/awscli.tmp;\ done column -t /tmp/awscli.tmp;\ rm /tmp/awscli.tmp /tmp/awscli-policy.tmp
- list-users — AWS CLI 2.9.0 Command Reference
- list-attached-user-policies — AWS CLI 2.9.0 Command Reference
IAM ユーザーにアタッチされたインラインポリシー一覧の取得
echo "UserName InlinePolicies" > /tmp/awscli.tmp aws iam list-users --query "Users[].[UserName]" --output text | sort | while read line;\ do echo ${line} > /tmp/awscli-policy.tmp;\ aws iam list-user-policies --user-name ${line} --query "PolicyNames[]" --output text >> /tmp/awscli-policy.tmp;\ cat /tmp/awscli-policy.tmp | tr "\n" " " | sed 's/$/\n/g' >> /tmp/awscli.tmp;\ done column -t /tmp/awscli.tmp;\ rm /tmp/awscli.tmp /tmp/awscli-policy.tmp
あとはスプレッドシートで頑張ろう
ここまでで大体材料が揃ったので、あとは必要に応じてスプレッドシートで頑張りましょう。
わたしの場合は COUNTIF や VLOOKUP が活躍しました。結局スプレッドシート捏ねてる時がいちばん楽しいですよね。
終わりに
IAM ユーザーについて、所属しているグループ、アタッチされているポリシーを一覧で取得したい、という話でした。
情報を一覧で取得するということにおいてはやはり AWS CLI が便利ですね。IAM ユーザーをきちんと管理できていないな、という場合に活用してもらえればと思います。
テンポラリなファイルに書き込んで終わったら消す、という方式が勉強になりました。
以上、 チバユキ (@batchicchi) がお送りしました。
追記
IAM ロールで同様のことを行うエントリを書きました。